package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;

import javax.faces.event.ActionEvent;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.thoughtworks.xstream.XStream;
import java.math.BigDecimal;
import javax.inject.Inject;
import org.hibernate.Hibernate;

import pe.com.cotelasa.common.controlador.MBGenerico;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKDocumentoSustentador;
import pe.com.cotelasa.scp.controlador.backingBean.BKMovCtaBancaria;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.helper.SelectOneMenuHelper;
import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.modelo.MovCtaBancariaModel;
import pe.com.cotelasa.scp.dominio.service.IServicioDocumentoSustentador;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.entidad.Banco;
import pe.com.cotelasa.scp.entidad.CuentaBancaria;
import pe.com.cotelasa.scp.entidad.DocumentoSustentador;
import pe.com.cotelasa.scp.entidad.MovimientoCajaChica;
import pe.com.cotelasa.scp.entidad.MovimientoCuentaBancaria;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Controller("MBMovimientoCuentaBancaria")
@Scope("request")
public class MBMovimientoCuentaBancaria extends MBGenerico implements IMantenedor, Serializable, IObserver {

    private static final long serialVersionUID = -6269044631137301914L;
    private static Logger logger = Logger.getLogger(MBMovimientoCuentaBancaria.class);
    @Autowired
    private BKSession session;
    @Autowired
    public BKMovCtaBancaria bkMovCtaBancaria;
    @Inject
    public MovCtaBancariaModel movCtaBancariaModel;
    @Inject
    private MBComponenteFindProveedor mbComponenteFindProveedor;
    @Inject
    private BKDocumentoSustentador bkDocumentoSustentador;
    @Inject
    private IServicioTipoMoneda servicioMoneda;
    @Inject
    private IServicioDocumentoSustentador servicioDocSustentador;

    public String mostrar() {
        try {
            bkMovCtaBancaria.setConsultaMovCtaBancaria(new MovimientoCuentaBancaria());
            bkMovCtaBancaria.getConsultaMovCtaBancaria().setIdCuentaBancaria(new CuentaBancaria(-1));
            //bkMovCtaBancaria.getConsultaMovCtaBancaria().getIdCuentaBancaria().setIdBanco(new Banco(-1));
            bkMovCtaBancaria.getConsultaMovCtaBancaria().getIdCuentaBancaria().setIdEmpresa(session.getEmpresa());
            //bkMovCtaBancaria.setListaBanco(SelectOneMenuHelper.listaBancosConsulta(movCtaBancariaModel.obtenerListaBancosActivos()));
            //bkMovCtaBancaria.setListaCuentaBancaria(SelectOneMenuHelper.listaCuentaBancariaConsulta(new ArrayList<CuentaBancaria>()));
            this.bkMovCtaBancaria.setListaCuentaBancariaConsulta(SelectOneMenuHelper.listaCuentaBancariaConsulta(movCtaBancariaModel.obtenerListaCuentaBancaria(session.getEmpresa().getId())));
            bkMovCtaBancaria.setListaMovCtaBancaria(null);
            bkMovCtaBancaria.setListaCtaBancaria(null);
            bkMovCtaBancaria.setTipoMovimiento(Constantes.TipoMovimiento.SALIDA);

        } catch (ModelExcepcion e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorCargar"));
            logger.error(e.getMensaje(), e);
            //movCtaBancariaModel.enviarCorreoError(e, e.getMensaje());
        }
        return URLPaginacion.MovCuentaBancaria.URL_CONSULTAR_MOV_CUENTA_BANCARIA;
    }

    public void buscar() {
        try {
            bkMovCtaBancaria.setListaCtaBancaria(movCtaBancariaModel.obtenerListaCuentaBancariaConsulta(
                    session.getEmpresa().getId(),bkMovCtaBancaria.getConsultaMovCtaBancaria().getIdCuentaBancaria().getId()));
           
            bkMovCtaBancaria.setListaMovCtaBancaria(movCtaBancariaModel.obtenerListaMovimientoCuentaBancaria(
                    bkMovCtaBancaria.getConsultaMovCtaBancaria(), bkMovCtaBancaria.getFechaInicio(), bkMovCtaBancaria.getFechaFinal()));
        } catch (ModelExcepcion ex) {
            logger.error(ex.getMensaje(), ex);
            //movCtaBancariaModel.enviarCorreoError(ex, ex.getMensaje());
        }

    }

    public String nuevo() {
        this.bkMovCtaBancaria.setComando(new ComandoGuardar(this));
        String URL = "";
        try {
            this.bkMovCtaBancaria.setFormularioMovCtaBancaria(new MovimientoCuentaBancaria());
            this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setIdCuentaBancaria(new CuentaBancaria(0));
            this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setEstadoMovimiento(MovimientoCuentaBancaria.ESTADO_MOV_CUENTA_BANCARIA.ABIERTO.getValor());
            this.bkMovCtaBancaria.setListaCuentaBancaria(SelectOneMenuHelper.listaCuentaBancariaFormulario(movCtaBancariaModel.obtenerListaCuentaBancaria(session.getEmpresa().getId())));
            cargarComponentesFormulario();

            if (this.bkMovCtaBancaria.getTipoMovimiento().equals("T")) {
                this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setTipoMovimiento(Constantes.TipoMovimiento.SALIDA);
                URL = URLPaginacion.MovCuentaBancaria.URL_FORMULARIO_TRANSFERENCIA_CUENTA_BANCARIA;
                this.bkMovCtaBancaria.setCuentaEntrada(new CuentaBancaria(0));
                this.bkMovCtaBancaria.setHabilitarTC(false);
            } else {
                this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setTipoMovimiento(this.bkMovCtaBancaria.getTipoMovimiento());
                URL = URLPaginacion.MovCuentaBancaria.URL_FORMULARIO_MOV_CUENTA_BANCARIA;
            }

        } catch (ModelExcepcion e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorCargar"));
            logger.error(e.getMensaje(), e);
            URL = URLPaginacion.MovCuentaBancaria.URL_CONSULTAR_MOV_CUENTA_BANCARIA;
            //movCtaBancariaModel.enviarCorreoError(e, e.getMensaje());
        }
        return URL;
    }

    public String editar() {
        bkMovCtaBancaria.setComando(new ComandoActualizar(this));
        try {
            cargarComponentesFormulario();
            this.bkMovCtaBancaria.setFormularioMovCtaBancaria(this.movCtaBancariaModel.obtenerMovimientoCuentaBancaria(this.bkMovCtaBancaria.getFormularioMovCtaBancaria().getId()));
            this.bkMovCtaBancaria.setListaCuentaBancaria(SelectOneMenuHelper.listaCuentaBancariaFormulario(movCtaBancariaModel.obtenerListaCuentaBancaria(session.getEmpresa().getId())));
        } catch (ModelExcepcion e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorCargar"));
            logger.error(e.getMensaje(), e);
            //movCtaBancariaModel.enviarCorreoError(e, e.getMensaje());
        }
        return URLPaginacion.MovCuentaBancaria.URL_FORMULARIO_MOV_CUENTA_BANCARIA;
    }

    public String guardar() {
        String URL = "";
        try {
            this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setUsrCreacion(session.getUsuario().getUsuario());
            this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setFecCreacion(new Date());
            this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setSaldo(this.bkMovCtaBancaria.getFormularioMovCtaBancaria().getMonto());
            //this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setNumCuentaBancaria(this.bkMovCtaBancaria.getFormularioMovCtaBancaria().getIdCuentaBancaria().getNumeroCuenta());
            if (this.bkMovCtaBancaria.getTipoMovimiento().equals("T")) {
                this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setSaldo(BigDecimal.ZERO);
                this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setFormaMovimiento("TRANSFERENCIA ENTRE CUENTAS");
                this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setFechaCierre(this.bkMovCtaBancaria.getFormularioMovCtaBancaria().getFechaMovimiento());

                movCtaBancariaModel.guardarMovimientoCuentaTransferida(this.bkMovCtaBancaria.getFormularioMovCtaBancaria(), this.bkMovCtaBancaria.getCuentaEntrada());
            }
            movCtaBancariaModel.guardarMovimientoCuentaBancaria(this.bkMovCtaBancaria.getFormularioMovCtaBancaria());
            mostrarMensaje("Se guardo el movimiento satisfactoriamente.");
            buscar();
            URL = URLPaginacion.MovCuentaBancaria.URL_CONSULTAR_MOV_CUENTA_BANCARIA;
        } catch (ModelExcepcion e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorGuardar"));
            logger.error(e.getMensaje(), e);
            if (this.bkMovCtaBancaria.getTipoMovimiento().equals("T")) {
                URL = URLPaginacion.MovCuentaBancaria.URL_FORMULARIO_TRANSFERENCIA_CUENTA_BANCARIA;
            } else {
                URL = URLPaginacion.MovCuentaBancaria.URL_FORMULARIO_MOV_CUENTA_BANCARIA;
            }

            //movCtaBancariaModel.enviarCorreoError(e, e.getMensaje());
        }
        return URL;
    }

    public String actualizar() {
        String URL = "";
        try {
            this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setUsrModificacion(session.getUsuario().getUsuario());
            this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setFecModificacion(new Date());
            //this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setEstadoMovimiento(Constantes.MovimientoCuentaBancaria.ESTADO_ABIERTO);
            if(this.bkMovCtaBancaria.getFormularioMovCtaBancaria().getDocumentoSustentadorCollection().isEmpty()){
                movCtaBancariaModel.actualizarMontoCuenta(this.bkMovCtaBancaria.getFormularioMovCtaBancaria().getId());
                this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setSaldo(this.bkMovCtaBancaria.getFormularioMovCtaBancaria().getMonto());
            }
            
            movCtaBancariaModel.actualizarMovimientoCuentaBancaria(this.bkMovCtaBancaria.getFormularioMovCtaBancaria());
            mostrarMensaje("Se actualizo el movimiento satisfactoriamente.");
            buscar();
            URL = URLPaginacion.MovCuentaBancaria.URL_CONSULTAR_MOV_CUENTA_BANCARIA;
        } catch (ModelExcepcion e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorActualizar"));
            logger.error(e.getMensaje(), e);
            URL = URLPaginacion.MovCuentaBancaria.URL_FORMULARIO_MOV_CUENTA_BANCARIA;
        }
        return URL;
    }

    private void cargarComponentesFormulario() throws ModelExcepcion {
        /*bkMovCtaBancaria.setListaBanco(SelectOneMenuHelper.listaBancosFormulario(movCtaBancariaModel.obtenerListaBancosActivos()));
         bkMovCtaBancaria.setListaCuentaBancaria(SelectOneMenuHelper.listaCuentaBancariaFormulario(new ArrayList<CuentaBancaria>()));*/
        //bkMovCtaBancaria.setListaTipoMoneda(SelectOneMenuHelper.listaTipoMonedaFormulario(movCtaBancariaModel.obtenerListaMonedaActivos()));
        //bkMovCtaBancaria.setListaTipoMovimiento(SelectOneMenuHelper.listaTipoMovimientoFormulario(movCtaBancariaModel.obtenerListaTipoMovimiento()));
        bkMovCtaBancaria.setListaFormaMovimiento(SelectOneMenuHelper.listaFormaMovimientoFormulario(movCtaBancariaModel.obtenerListaFormaMovimiento()));
    }


    @Override
    public void eliminar(ActionEvent actionEvent) {
        try{
            movCtaBancariaModel.actualizarMontoCuenta(this.bkMovCtaBancaria.getSeleccionarMovCtaBancaria().getId());
            this.bkMovCtaBancaria.getSeleccionarMovCtaBancaria().setUsrModificacion(session.getUsuario().getUsuario());
            this.bkMovCtaBancaria.getSeleccionarMovCtaBancaria().setFecModificacion(new Date());
            this.bkMovCtaBancaria.getSeleccionarMovCtaBancaria().setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            
            movCtaBancariaModel.eliminarMovimientoCuentaBancaria(this.bkMovCtaBancaria.getSeleccionarMovCtaBancaria());
            buscar();
        } catch (ModelExcepcion e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorActualizar"));
            logger.error(e.getMensaje(), e);
        }
    }

    @Override
    public String ver() {
        try{
            this.bkMovCtaBancaria.setSeleccionarMovCtaBancaria(
                    movCtaBancariaModel.obtenerMovimientoCuentaBancaria(this.bkMovCtaBancaria.getSeleccionarMovCtaBancaria().getId()));
            
        } catch (ModelExcepcion e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorActualizar"));
            logger.error(e.getMensaje(), e);
        }
        return URLPaginacion.MovCuentaBancaria.URL_VER_MOV_CUENTA_BANCARIA;
    }

    @Override
    public String aceptar() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String retroceder() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String cancelar() {
        /*bkMovCtaBancaria.setFormularioMovCtaBancaria(new MovimientoCuentaBancaria());
        mostrar();*/
        return URLPaginacion.MovCuentaBancaria.URL_CONSULTAR_MOV_CUENTA_BANCARIA;
    }

    /*public void seleccionarBancoConsulta() {
     Integer idBanco = this.bkMovCtaBancaria.getConsultaMovCtaBancaria().getIdCuentaBancaria().getIdBanco().getId();
     logger.info("Id Banco : " + idBanco);
     try {
     if (idBanco == -1) {
     this.bkMovCtaBancaria.setListaCuentaBancaria(SelectOneMenuHelper.listaCuentaBancariaConsulta(new ArrayList<CuentaBancaria>()));
     } else {
     this.bkMovCtaBancaria.setListaCuentaBancaria(SelectOneMenuHelper.listaCuentaBancariaConsulta(movCtaBancariaModel.obtenerListaCuentaBancaria(idBanco)));
     }
     } catch (ModelExcepcion e) {
     mostrarError(serviceProperties.getProperty("cotelasa.message.errorCargar"));
     logger.error(e.getMensaje(), e);
     //movCtaBancariaModel.enviarCorreoError(e, e.getMensaje());
     }
     }*/
    public void seleccionarCuentaBancaria() {
        Integer idCuentaBancaria = this.bkMovCtaBancaria.getFormularioMovCtaBancaria().getIdCuentaBancaria().getId();
        try {
            this.bkMovCtaBancaria.getFormularioMovCtaBancaria().getIdCuentaBancaria().setIdTipoMoneda(movCtaBancariaModel.obtenerCuentaBancaria(idCuentaBancaria).getIdTipoMoneda());
        } catch (ModelExcepcion e) {
            mostrarError(serviceProperties.getProperty("cotelasa.message.errorCargar"));
            logger.error(e.getMensaje(), e);
            //movCtaBancariaModel.enviarCorreoError(e, e.getMensaje());
        }

    }

    public void seleccionarCuentaBancariaEntrada() {
        Integer idCuentaBancaria = this.bkMovCtaBancaria.getCuentaEntrada().getId();
        this.bkMovCtaBancaria.getFormularioMovCtaBancaria().setTipoCambio(null);
        if (idCuentaBancaria != this.bkMovCtaBancaria.getFormularioMovCtaBancaria().getIdCuentaBancaria().getId()) {
            try {
                this.bkMovCtaBancaria.setCuentaEntrada(movCtaBancariaModel.obtenerCuentaBancaria(idCuentaBancaria));
            } catch (ModelExcepcion e) {
                mostrarError(serviceProperties.getProperty("cotelasa.message.errorCargar"));
                logger.error(e.getMensaje(), e);
                //movCtaBancariaModel.enviarCorreoError(e, e.getMensaje());
            }
            this.bkMovCtaBancaria.setHabilitarTC(verificarMoneda());
        } else {
            this.bkMovCtaBancaria.getCuentaEntrada().setId(0);
            mostrarError("Debe elegir cuentas diferentes.");
        }

    }

    public boolean verificarMoneda() {
        boolean flag = false;
        if (!this.bkMovCtaBancaria.getFormularioMovCtaBancaria().getIdCuentaBancaria().getIdTipoMoneda().getId().equals(this.bkMovCtaBancaria.getCuentaEntrada().getIdTipoMoneda().getId())) {
            flag = true;
        }

        return flag;
    }

    // OPERACIONES CON EL DOCUMENTO SUSTENTADOR DE MOVIMIENTO
    // ######################################################
    public String sustentarMovimiento() {
        mbComponenteFindProveedor.clearObserver();
        mbComponenteFindProveedor.addObserver(this);
        //Hibernate.initialize(bkMovCtaBancaria.getSeleccionarMovCtaBancaria().getIdCuentaBancaria().getIdTipoMoneda());
        //System.out.println("moneda: "+bkMovCtaBancaria.getSeleccionarMovCtaBancaria().getIdCuentaBancaria().getIdTipoMoneda().getSimbolo());
        try {
            bkMovCtaBancaria.setSeleccionarMovCtaBancaria(movCtaBancariaModel.obtenerMovimientoCuentaBancaria(bkMovCtaBancaria.getSeleccionarMovCtaBancaria().getId()));
            System.out.println("moneda: " + bkMovCtaBancaria.getSeleccionarMovCtaBancaria().getIdCuentaBancaria().getIdTipoMoneda().getSimbolo());
            bkDocumentoSustentador.setListaTodosDocumentosSustentadores(servicioDocSustentador.listarDocSustentadorPorCuenta(bkMovCtaBancaria.getSeleccionarMovCtaBancaria()));
            bkDocumentoSustentador.setListaMonedas(servicioMoneda.listarTipoMonedasActivos());

        } catch (Exception e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            System.err.println(e);
            logger.error(e.getMessage(), e);
        }

        bkDocumentoSustentador.setDocSustentadorFormulario(new DocumentoSustentador());
        bkDocumentoSustentador.getDocSustentadorFormulario().setMoneda(new TipoMoneda(0));
        //bkDocumentoSustentador.setDocSustentadorSeleccionado(new DocumentoSustentador());
        //bkDocumentoSustentador.getDocSustentadorFormulario().setTipoCambio(BigDecimal.ZERO);      


        return URLPaginacion.MovCuentaBancaria.URL_SUSTENTAR_MOVIMIENTO;

    }

    public String cerrarMovimiento() {

        // Solo cerramos mov cuando se encuentre en estado ABIERTO

        MovimientoCuentaBancaria movCuenta = bkMovCtaBancaria.getSeleccionarMovCtaBancaria();
        MovimientoCuentaBancaria movCuentaEntrada = new MovimientoCuentaBancaria();

        //String movCerrarSolicitante;
        //movCerrarSolicitante = movCajaChica.getSolicitante();
        BigDecimal saldoMovSeleccionado = movCuenta.getSaldo();


        try {
            //Actualizar el nuevo saldo de la caja chica y registrar un nuevo movimiento
            // de entrada a la caja por el saldo del movimiento cerrado
            if (saldoMovSeleccionado.compareTo(BigDecimal.ZERO) == 1) {

                movCuentaEntrada.setId(null);

                movCuentaEntrada.setMonto(saldoMovSeleccionado);

                movCuentaEntrada.setSaldo(BigDecimal.ZERO);
                movCuentaEntrada.setEstadoMovimiento(MovimientoCuentaBancaria.ESTADO_MOV_CUENTA_BANCARIA.CERRADO.getValor());
                movCuentaEntrada.setMotivo("DEVOLUCIÓN DE DINERO");
                movCuentaEntrada.setDescripcion("Se devuelve un saldo de " + saldoMovSeleccionado);
                movCuentaEntrada.setFechaCierre(new Date());
                movCuentaEntrada.setFecCreacion(new Date());
                movCuentaEntrada.setUsrCreacion(session.getUsuario().getUsuario());
                movCuentaEntrada.setTipoMovimiento(Constantes.TipoMovimiento.ENTRADA);

                movCtaBancariaModel.guardarMovimientoCuentaBancaria(movCuentaEntrada);

            }

            // Actualizando el saldo y estado del movimiento que se cerro
            movCuenta.setEstadoMovimiento(MovimientoCajaChica.ESTADO_MOV_CAJA_CHICA.CERRADO.getValor());
            movCuenta.setFechaCierre(new Date());
            movCuenta.setUsrModificacion(session.getUsuario().getUsuario());
            movCuenta.setFecModificacion(new Date());
            movCuenta.setSaldo(BigDecimal.ZERO);

            movCtaBancariaModel.actualizarMovimientoCuentaBancariaSinMontos(movCuenta);

            //bkMovimientoCajaChica.setListaMovCajaChicaActivas(null);
            //bkMovimientoCajaChica.setListaMovCajaChicaActivas(servicioMovCajaChica.listarMovCajaChicaActiva(cajaChica));
            mostrarMensaje("Se cerró el movimiento satisfactoriamente");
            //return "";
            return mostrarMantenimientoMovimientos();

        } catch (Exception e) {
            mostrarError("Ocurrieron algunos problemas al cerrar el movimiento. Vuelva a intentar.");
            logger.error(e.getMessage(), e);

            return URLPaginacion.MovCuentaBancaria.URL_SUSTENTAR_MOVIMIENTO;
        }

    }

    public String cancelarSustentoMovimiento() {
        return mostrarMantenimientoMovimientos();
    }

    public String mostrarMantenimientoMovimientos() {

        buscar();
        return URLPaginacion.MovCuentaBancaria.URL_CONSULTAR_MOV_CUENTA_BANCARIA;
    }

    public void guardarDocumentoSustentador() {

        DocumentoSustentador docSustentador = bkDocumentoSustentador.getDocSustentadorFormulario();
        MovimientoCuentaBancaria movCuenta = bkMovCtaBancaria.getSeleccionarMovCtaBancaria();

        if (movCuenta.getSaldo().doubleValue() >= docSustentador.getTotal().doubleValue()) {

            try {

                docSustentador.setIdMovimientoCuentaBancaria(movCuenta);
                docSustentador.setUsrCreacion(session.getUsuario().getUsuario());
                docSustentador.setFecCreacion(new Date());

                servicioDocSustentador.registrarDocSustentador(docSustentador);

                //Actualizamos el saldo del movimiento
                movCuenta.setSaldo(movCuenta.getSaldo().subtract(docSustentador.getTotal()));

                movCtaBancariaModel.actualizarMovimientoCuentaBancariaSinMontos(movCuenta);
                //bkMovimientoCajaChica.setMovCajaChicaSeleccionado(movCuenta);

                bkDocumentoSustentador.setListaTodosDocumentosSustentadores(servicioDocSustentador.listarDocSustentadorPorCuenta(movCuenta));
                //Limpiamos buffer

                bkDocumentoSustentador.setDocSustentadorFormulario(new DocumentoSustentador());
                bkDocumentoSustentador.getDocSustentadorFormulario().setMoneda(new TipoMoneda(0));

            } catch (Exception e) {

                mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
                System.err.println(e);
                logger.error(e.getMessage(), e);
            }

        } else {
            mostrarError("El monto del documento excede el saldo del movimiento que falta justificar. Vuelva a intentar");
        }
        mbComponenteFindProveedor.clearObserver();
        mbComponenteFindProveedor.addObserver(this);

    }

    public void eliminarDocumentoSustentador(ActionEvent actionEvent) {

        DocumentoSustentador docSustentador = bkDocumentoSustentador.getDocSustentadorSeleccionado();
        MovimientoCuentaBancaria movCuenta = bkMovCtaBancaria.getSeleccionarMovCtaBancaria();

        docSustentador.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
        docSustentador.setUsrModificacion(session.getUsuario().getUsuario());
        docSustentador.setFecModificacion(new Date());
        try {
            movCuenta.setSaldo(movCuenta.getSaldo().add(docSustentador.getTotal()));
            movCtaBancariaModel.actualizarMovimientoCuentaBancariaSinMontos(movCuenta);

        } catch (ModelExcepcion e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        try {


            //Actualizar el doc sustentador
            servicioDocSustentador.actualizarDocSustentador(docSustentador);

            bkDocumentoSustentador.setListaTodosDocumentosSustentadores(servicioDocSustentador.listarDocSustentadorPorCuenta(movCuenta));



        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }

    }

    @Override
    public void actualizarObservador(Object object) {
        if (object instanceof Proveedor) {
            Proveedor proveedor = (Proveedor) object;
            bkDocumentoSustentador.getDocSustentadorFormulario().setIdEntidad(proveedor.getId());
            bkDocumentoSustentador.getDocSustentadorFormulario().setRuc(proveedor.getRuc());
            bkDocumentoSustentador.getDocSustentadorFormulario().setRazonSocial(proveedor.getRazonSocial());
            
        }
    }

    public void obtenerMontoTotal() {
        if (bkDocumentoSustentador.getDocSustentadorFormulario().getTipoCambio() != null) {
            bkDocumentoSustentador.getDocSustentadorFormulario().setTotal(
                    bkDocumentoSustentador.getDocSustentadorFormulario().getMontoDocumento().multiply(bkDocumentoSustentador.getDocSustentadorFormulario().getTipoCambio()));
        } else {
            //if (bkDocumentoSustentador.getDocSustentadorFormulario().getMoneda().getId() == Constantes.TipoMoneda.SOLES) {
            bkDocumentoSustentador.getDocSustentadorFormulario().setTotal(bkDocumentoSustentador.getDocSustentadorFormulario().getMontoDocumento());
            //}
        }
    }

    public void cambiarMoneda() {
        if (bkDocumentoSustentador.getDocSustentadorFormulario().getMoneda().getId().equals(bkMovCtaBancaria.getSeleccionarMovCtaBancaria().getIdCuentaBancaria().getIdTipoMoneda().getId())) {
            bkDocumentoSustentador.getDocSustentadorFormulario().setTipoCambio(null);
            bkDocumentoSustentador.getDocSustentadorFormulario().setTotal(bkDocumentoSustentador.getDocSustentadorFormulario().getMontoDocumento());
        }
    }
}
